/**  
 * @Title:  patPractice0050.java   
 * @Package com.wkr.pat.basiclevel   
 * @Description:    TODO(用一句话描述该文件做什么)   
 * @author: WuKangrong     
 * @date:   2018年7月21日 上午10:55:15   
 * @version V
 * @JDKversion:1.8.0
 * @Copyright: 2018  
*/
package com.wkr.pat.basiclevel;
import java.util.*;
/**   
 * @ClassName:  patPractice0050   
 * @Description:TODO(pat练习0050,实现螺旋矩阵)   
 * @author: WuKangrong 
 * @date:   2018年7月21日 上午10:55:15     
 * @Copyright: 2018 
 */

//非素数和1的问题没解决
public class patPractice0050 {

	static List<Integer> list = new ArrayList<Integer>();
	static int in_Num;
	static int[] temp_Data;//临时存储数据
	/**   
	 * @Title: main   
	 * @Description: TODO(主函数)   
	 * @param: @param args      
	 * @return: void      
	 * @throws   
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		inputControl();
	}
	
	/**   
	 * @Title: inputControl   
	 * @Description: TODO(输入交互)   
	 * @param:       
	 * @return: void      
	 * @throws   
	 */
	static void inputControl() 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("请输入非素数：");
		in_Num = input.nextInt();
		temp_Data = new int[in_Num];
		editData();
		long tStar = System.currentTimeMillis();//系统当前时间
		insertAndPrint();
		long tEnd = System.currentTimeMillis();//系统当前时间
		double time = (-tStar + tEnd) /1000.0;
		System.out.println("运行时间为：" + time + "s");//统计程序运行时间
	}
	
	/**   
	 * @Title: editData   
	 * @Description: TODO(写入数据并存入集合中，经过降序排序后导出到一维临时数组中)   
	 * @param:       
	 * @return: void      
	 * @throws   
	 */
	static void editData()
	{
		Scanner input = new Scanner(System.in);
		System.out.println("请输入数据并以空格隔开：");
		String in_AllData = input.nextLine();
		String[] data;
		data = in_AllData.split(" ");
		for(int array_Length = 0; array_Length < data.length; array_Length++) {
			Integer number = Integer.valueOf(data[array_Length]);
			list.add(number);
			Collections.sort(list, new NumComparator());
		}
		Iterator<Integer> it = list.iterator();
		int array_Position = 0;
		/**
		 * 将集合内排列好的数据存入temp_Data临时数组
		 */
		while(it.hasNext()) {
			temp_Data[array_Position] = Integer.valueOf(it.next().toString());
			array_Position++;
		}
	}
	/**   
	 * @Title: insertAndPrint   
	 * @Description: TODO(将已排序的一维数组内数据按螺旋导入到二维数组内)   
	 * @param:       
	 * @return: void      
	 * @throws   
	 */
	static void insertAndPrint()
	{
		/**
		 * @param right_BigNum 找到因式分解两数之差最小时，较大的数
		 * @param two_Minus 因式分解两数之差
		 */
		int right_BigNum = in_Num;
		int right_SmallNum = 0;
		int two_Minus = in_Num;
		/**
		 * 完成对输入值的因式分解，保证两数之差最小
		 */
		for(int flag_Div = 2; flag_Div <= in_Num / 2; flag_Div++) {
			if (in_Num % flag_Div == 0) {
				if (in_Num / flag_Div <= flag_Div) {
					if (flag_Div - (in_Num / flag_Div) < two_Minus) {
						two_Minus = flag_Div - (in_Num / flag_Div);
						right_BigNum = flag_Div;
						right_SmallNum = (in_Num / flag_Div);
					}
				}
			}
		}
		//创建二维数组
		int[][] array_Data = new int[right_BigNum][right_SmallNum];
		/**
		 * @param north_Flag 北边未完成插入的位置
		 * @param south_Flag 南边未完成插入的位置
		 * @param east_Flag 东边未完成插入的位置
		 * @param west_Flag 西边未完成插入的位置
		 * @param x_Position 行坐标
		 * @param y_Position 列坐标
		 * @param tempArray_Position temp_Data数组的下标
		 */
		int north_Flag = 0;
		int south_Flag = 0;
		int east_Flag = 0;
		int west_Flag = 0;
		int x_Position = 0;
		int y_Position = 0;
		int tempArray_Position = 0;
		while (true) {
			if(x_Position == north_Flag && y_Position < right_SmallNum - east_Flag) {//实现对最北边的数据录入
				array_Data[x_Position][y_Position] = temp_Data[tempArray_Position];
				System.out.println("Array1[" + x_Position + "][" + y_Position + "] = " + array_Data[x_Position][y_Position]);
				if(y_Position != right_SmallNum - east_Flag - 1) {
					y_Position++;
					tempArray_Position++;
					System.out.println("次数" + tempArray_Position);
				}else{
					x_Position++;
					tempArray_Position++;
					System.out.println("次数" + tempArray_Position);
				}
			}else if (x_Position < right_BigNum - south_Flag && y_Position == right_SmallNum - east_Flag - 1) {//实现对最东边的数据录入
				array_Data[x_Position][y_Position] = temp_Data[tempArray_Position];
				System.out.println("Array2[" + x_Position + "][" + y_Position + "] = " + array_Data[x_Position][y_Position]);
				if(x_Position != right_BigNum - south_Flag - 1) {
					x_Position++;
					tempArray_Position++;
					System.out.println("次数" + tempArray_Position);
				}else{
					y_Position--;
					tempArray_Position++;
					System.out.println("次数" + tempArray_Position);
				}
			}else if(x_Position == right_BigNum - south_Flag - 1 && y_Position >= west_Flag) {//实现对最南边的数据录入
				array_Data[x_Position][y_Position] = temp_Data[tempArray_Position];
				System.out.println("Array3[" + x_Position + "][" + y_Position + "] = " + array_Data[x_Position][y_Position]);
				if(y_Position != west_Flag) {
					tempArray_Position++;
					y_Position--;
					System.out.println("次数" + tempArray_Position);
				}else{
					x_Position--;
					tempArray_Position++;
					System.out.println("次数" + tempArray_Position);
				}
			}else{//完成对最西边的数据录入
				array_Data[x_Position][y_Position] = temp_Data[tempArray_Position];
				System.out.println("Array4[" + x_Position + "][" + y_Position + "] = " + array_Data[x_Position][y_Position]);
				if(x_Position != north_Flag) {
					if(x_Position - 1 == north_Flag){//当x_Position最接近北边时，但北边此时已经输入完成，y_Position++操作使进行北边第二行录入进入到l第一个if语句
						tempArray_Position++;
						y_Position++;
						north_Flag++;
						south_Flag++;
						east_Flag++;
						west_Flag++;
					}else {//还未接近北边则x_Position--以接近北边
						x_Position--;
						tempArray_Position++;
					}
				}
			}
			//当临时数组的下标等于输入值时，结束循环
			if(tempArray_Position == in_Num) {
				break;
			}
		}
		for(int x_Int = 0; x_Int < right_BigNum; x_Int++) {
			for(int y_Int = 0; y_Int < right_SmallNum; y_Int++) {
				System.out.format("%3d",array_Data[x_Int][y_Int]);
			}
			System.out.println();
		}
		System.out.println("输出完成！");
	}

}
